import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

//setUp: 在每个测试之前初始化一个新的 Service 对象，带有 10x10 的网格。
//testService: 检查网格是否正确初始化，所有细胞是否设置为死亡（0）。
//testGetNowGeneration: 确保在构建后以及更新后代数计数器的准确性。
//testRandomCell: 验证 randomCell 方法是否能够随机地初始化网格中的细胞为活或死。
//testDeleteAllCell: 确保 deleteAllCell 方法能够将网格中的所有细胞设置为死亡。
//testUpdate: 测试 update 方法，使用简单的已知模式（闪烁器）来确保游戏逻辑正确更新网格状态。

class ServiceTest {

    private Service service;
    private final int numRows = 10;
    private final int numCols = 10;

    @BeforeEach
    void setUp() {
        // 初始化一个10x10的网格的Service对象
        service = new Service(numRows, numCols);
    }

    /**
     * 测试Service构造函数是否正确地初始化网格并将所有细胞设为死亡状态。
     */
    @Test
    void testService() {
        assertEquals(0, service.getNowGeneration(), "开始时代数应为0");
        int[][] grid = service.getGrid();
        for (int i = 1; i <= numRows; i++) {
            for (int j = 1; j <= numCols; j++) {
                assertEquals(0, grid[i][j], "所有细胞初始应为死亡状态");
            }
        }
    }

    /**
     * 测试getNowGeneration方法是否返回正确的代数。
     */
    @Test
    void testGetNowGeneration() {
        // 测试初始代数
        assertEquals(0, service.getNowGeneration(), "初始代数应为0");
        // 模拟更新后测试代数
        service.update();
        assertEquals(1, service.getNowGeneration(), "更新后代数应增加");
    }

    /**
     * 测试randomCell方法是否正确随机初始化细胞为活或死。
     */
    @Test
    void testRandomCell() {
        service.randomCell();
        int[][] grid = service.getGrid();
        boolean hasAlive = false;
        boolean hasDead = false;
        for (int i = 1; i <= numRows; i++) {
            for (int j = 1; j <= numCols; j++) {
                if (grid[i][j] == 1) hasAlive = true;
                if (grid[i][j] == 0) hasDead = true;
            }
        }
        assertTrue(hasAlive, "网格中应至少有一个活细胞");
        assertTrue(hasDead, "网格中应至少有一个死细胞");
    }

    /**
     * 测试deleteAllCell方法是否将所有细胞设置为死亡。
     */
    @Test
    void testDeleteAllCell() {
        service.randomCell(); // 先随机初始化网格
        service.deleteAllCell(); // 然后清除所有细胞
        int[][] grid = service.getGrid();
        for (int i = 1; i <= numRows; i++) {
            for (int j = 1; j <= numCols; j++) {
                assertEquals(0, grid[i][j], "所有细胞应被设置为死亡");
            }
        }
    }

    /**
     * 测试update方法确保其正确实现生命游戏的规则。
     */
    @Test
    void testUpdate() {
        int[][] initialGrid = new int[numRows + 2][numCols + 2];
        // 设置一个简单的模式，例如闪烁器（振荡器）
        initialGrid[6][5] = 1;
        initialGrid[6][6] = 1;
        initialGrid[6][7] = 1;
        service.setGrid(initialGrid);
        service.update();

        // 检查振荡器是否改变了方向
        assertEquals(1, service.getGrid()[5][6], "上中细胞应为活细胞");
        assertEquals(1, service.getGrid()[6][6], "中心细胞应为活细胞");
        assertEquals(1, service.getGrid()[7][6], "下中细胞应为活细胞");
        assertEquals(0, service.getGrid()[6][5], "左中细胞应为死细胞");
        assertEquals(0, service.getGrid()[6][7], "右中细胞应为死细胞");
    }
}
